都有自己的艦隊了~再架一個自己的港口還好吧~
圖片來源:Docker (@Docker) / Twitter
要如何讓 cluster 上所有機器都能取得 image 呢?
需要架設一個 registry 提供外部存取 image
公有的 registry 如 DockerHub
各大雲端平台也都有提供自己管理 registry 的功能 (AWS, AZURE, GCP, ...)
那... 想自己架自己管呢? Harbor
圖片來源:Harbor
Harbor 也是 CNCF project 之一哦!
這篇以 nodePort 架設,之後介紹完 ingress 和 ingress controller 才會回頭用 ingress 架設哦!
接下來我們會使用 Helm 架設,先來簡單安裝一下~
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm
檢查一下安裝有沒有成功...
helm version
接下來會直接把 Harbor 架設在 Kubernetes
預期 cluster Node 能從 Harbor 取得 image 後進行部署
本篇使用 Harbor helm version 1.9.3
kubectl create ns harbor
helm repo add harbor https://helm.goharbor.io
helm show values harbor/harbor --version 1.9.3 >> values.yaml
然後就會取得一個大概 900 多行的設定檔...
使用 Node whale1 (ip: 10.1.0.1, port: 30003) 對外服務
expose
:
type: nodePort
: 使用 nodePort 公開服務tls.enabled: true
: 使用 tlstls.certSource: auto
: 自動產生憑證tls.auto.commonName: "harbor.cluster.example"
: 設定憑證的 CN,改成自己管的 domainnodePort.ports.https.nodePort: 30003
: 使用 30003 portexternalURL: https://10.1.0.1:30003
: 設定外部連接的 URL,和連接 registry 機制有關,這裡直接使用主機 ippersistence.enabled: false
: 先不使用 PersistenceVolume,之後的篇章會再補充介紹harborAdminPassword: Harbor12345
: 預設 admin 登入密碼nginx.nodeSelector: {kubernetes.io/hostname: whale1}
: 指定使用 Node完整設定檔可以到我的 github Day 14 - values-nodePort.yaml 查看
設定完成後使用 helm install
helm install harbor -f values-nodePort.yaml --namespace harbor harbor/harbor --version 1.9.3
等待 Pod 都開啟後就能連上網站~
記得登入後要修改 admin 密碼!
/etc/docker/daemon.json
增加 insecure-registries
{
"insecure-registries" : ["10.1.0.1:30003"]
}
sudo systemctl restart docker
$ docker login https://10.1.0.1:30003/
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ docker image ls alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.16.2 a6215f271958 6 weeks ago 5.29MB
$ docker tag alpine:3.16.2 10.1.0.1:30003/library/alpine:3.16.2
$ docker push 10.1.0.1:30003/library/alpine:3.16.2
The push refers to repository [10.1.0.1:30003/library/alpine]
994393dc58e7: Pushed
3.16.2: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
回到網頁上就能看到 image 已經在上面了~
記得登出 registry
$ docker logout https://10.1.0.1:30003
Removing login credentials for 10.1.0.1:30003
前面已經將 alpine image 推上去,接著在 kubernetes 測試使用
/etc/docker/daemon.json
增加 insecure-registries
{
"insecure-registries" : ["10.1.0.1:30003"]
}
sudo systemctl restart docker
apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: harbor
labels:
name: test-pod
spec:
containers:
- name: test-pod
image: 10.1.0.1:30003/library/alpine:3.16.2
command: ["/bin/sh", "-c"]
args:
- "sleep 5m"
resources:
limits:
memory: "128Mi"
cpu: "500m"
可以直接複製 github Day 14 - test-pod.yaml
kubectl apply -f test-pod.yaml
從 describe 看 Pod Events
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 33s default-scheduler Successfully assigned harbor/test-pod to whale1
Normal Pulling 31s kubelet Pulling image "10.1.0.1:30003/library/alpine:3.16.2"
Normal Pulled 30s kubelet Successfully pulled image "10.1.0.1:30003/library/alpine:3.16.2" in 710.688324ms
Normal Created 29s kubelet Created container test-pod
Normal Started 29s kubelet Started container test-pod
成功從 10.1.0.1:30003 取得 image!
清除 test-pod...
kubectl delete -f test-pod.yaml
這裡使用的是 library 公開的,所以 Kubernetes 不需登入也能 pull image 哦
如果你也覺得用 nodePort 很怪,接下來會介紹 ingress 還有安裝 ingress controller,之後會回頭使用 ingress 架設 Harbor
在更後面也會透過 openssl 自簽憑證讓 cluster 機器不用再設定 insecure-registries
哦!
敬請期待~